package beanstao.util.store.dal.interfaces;

import beanstao.util.id.Id;
import beanstao.util.store.database.Columns;
import beanstao.util.store.database.Where;
import beanstao.util.store.domainobject.DomainList;


/**
 * 数据的Query功能接口(基础接口，复杂查询需继承重新定义)。<br>
 * 比较轻松的办法是从 'beanstao.util.store.dal.AbstractDomainDbDal' 继承。
 * 
 * @author beanstao@google.com 
 * @version 3.0
 * @date 2010-08-11 17:26:15
 * 
 * @param <T> DomainObject
 * 
 */
public interface IDomainSelect<T>
{

	/**
	 * 查询指定的实体是否已持久化
	 * 
	 * @return
	 */
	boolean exists(T domain);

	/**
	 * 根据指定的实体的Id获得本实体的所有值
	 * 
	 * @return
	 */
	T select(Id id);

	/**
	 * 根据指定的条件集合查询记录的个数，指定的条件为Null时，返回所有的记录的个数
	 * 
	 * @param where 指定的条件
	 * @return
	 */
	int count(Where where);

	/**
	 * 根据指定的条件集合查询记录集合
	 * 
	 * @param where 指定的条件
	 * @return
	 */
	DomainList<T> select(Columns select, Where where);

	/**
	 * 根据指定的条件查询记录，返回指定记录的TOP个数
	 * 
	 * @param top 前几条
	 * @return
	 */
	DomainList<T> select(Columns select, Where where, Integer top);

	/**
	 * 根据指定的条件集合分页查询记录
	 * 
	 * @param start 记录的起始点
	 * @param limit 本次查询的记录条数
	 * @return
	 */
	DomainList<T> select(Columns select, Where where, Integer start, Integer limit);

	/**
	 * 根据指定的条件键值查询（单一条件查询）记录
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	DomainList<T> select(Columns select, String key, Object value);

	/**
	 * 查询所有
	 * 
	 * @return
	 */
	DomainList<T> selectAll();
}
